"""
@author: Del
@contact: delfung@163.com
@time: 2020/4/7 12:33
@desc: 0.1修改提示方式，当值不为空的时候显示实际值，当值为空的时候显示默认值
"""
import re
import jsonpath
import pytest
from datetime import datetime
from task import *
from py._xmlgen import html


@pytest.fixture(name='case')
def s_t_func(request):
    """
    测试用例运行前进行数据调减
    """
    _global_var = ""
    cache.set("case_desc", request.param.pop('caseDesc'))
    cache.set("case_id", request.param.pop('caseId'))
    cache.set("case_name", request.param.pop('caseName'))
    cache.set("module", request.param.pop('module'))
    _skip_desc = request.param.pop('skipDesc')
    if request.param.pop('isRun') == "T":  # 判断时候运行是进入 否跳出
        root_url = request.param.pop('rootUrl')
        leaf_url = request.param.pop('leafUrl')
        if root_url:
            url = f'{root_url}{leaf_url}'
        elif CONFIG.IS_GET_APPINFO_ROOT_URL:
            root_url = data_depot.get('APPINFO', f'{CONFIG.ENV}.{module}.Url')
            url = f'{root_url}{leaf_url}'
        else:
            pytest.xfail(f'没有开启获取自动获取rootUrl,也没有填写root_url，请检查是否用例或config文件')
        request.param['url'] = url
        req = datas_change(request.param, ORA_HAND)
        cache.set('expect', {'Status_code': req.pop('statusCode'), 'expected': req.pop('expected')})
        if req.get('globalVar'):
            _global_var = req.pop('globalVar')
        # 是否有body数据
        if 'bodyType' in req.keys():
            body_type = req.pop('bodyType')
            body_data = req.pop('bodyData')
            # TODO 这里要写的是先判断BodyData是否有值，如果有值替换掉，如果没有值忽略
            if body_data and body_type:
                req[body_type] = body_data
        # 是否需要认证
        if CONFIG.IS_AUTH:
            if 'headers' in req.keys() and data_depot.get('APPINFO', f'{CONFIG.ENV}.Auth.DataTo') == 'headers':
                authorization = data_depot.get('APPINFO', f'{CONFIG.ENV}.{module}.Authorization')
                req['headers'].update({"Authorization": authorization})
            elif data_depot.get('APPINFO', f'{CONFIG.ENV}.Auth.DataTo') == 'params':
                access_token = data_depot.get('APPINFO', f'{CONFIG.ENV}.{module}.access_token')
                if 'params' in req.keys():
                    req['params'].update({'access_token': access_token})
                else:
                    req['params'] = {'access_token': access_token}
        yield req
        if _global_var and cache.get('response'):
            _set_global_var(_global_var)  # 设置全局变量
    else:
        pytest.skip(_skip_desc if _skip_desc != '' else '未说明')


def _set_global_var(gv):
    """
    :param gv 期望设置的全局变量
    存为全局变量
    """
    for i in gv:
        _temp_gv = jsonpath.jsonpath(cache.get('response'), i[1])
        # jsonpath 和设置全局变量的时候任意一个返回false都失败
        if not _temp_gv:
            log.error(f"全局变量{i[0]},设置失败,请检查您的case文件, gloabVar字段，填写的代码是否正确！")
            raise ValueError(f"全局变量{i[0]},设置失败,请检查您的case文件, gloabVar字段，填写的代码是否正确！")
        else:
            data_depot.update('GLOBALS', None, {i[0]: _temp_gv[0]})


# 修改原有的标题使用自己的标题
def pytest_html_report_title(report):
    report.title = CONFIG.REPORT_TITLE


# 修改metadata里面的数据
def pytest_configure(config):
    if config._metadata.get('JAVA_HOME', None):
        config._metadata.pop('JAVA_HOME')
    config._metadata.pop('Plugins')
    config._metadata.pop('Packages')
    config._metadata.update(CONFIG.TEST_ENV_INFO)


# 修改Summer信息
def pytest_html_results_summary(prefix, summary, postfix):
    prefix.extend([html.p(f"所属部门: {CONFIG.TEST_SUMMARY_INFO.get('所属部门')}")])
    prefix.extend([html.p(f"测试人员: {CONFIG.TEST_SUMMARY_INFO.get('测试人员')}")])


# 更改表头信息
def pytest_html_results_table_header(cells):
    cells.insert(1, html.th('ID', class_='sortable numeric', col='id'))  # 利用class 进行数据值排序 sotrtable 表示函数 numeric 表示类型
    cells.insert(3, html.th('Description'))
    cells.insert(4, html.th('Time', class_='sortable time', col='time'))
    cells.insert(2, html.th('Test'))
    cells.pop(3)
    # 可以新增列但是以上别动
    cells.pop()


# 更改表行信息
def pytest_html_results_table_row(report, cells):
    cells.insert(1, html.td(cache.get('case_id'), class_='col-id'))
    cells.insert(3, html.td(cache.get('case_desc'), class_='col-desc'))
    cells.insert(4, html.td(datetime.utcnow(), class_='col-time'))
    cells.insert(2, html.td(re.findall(r'[[](.*)[]]$', report.nodeid.encode("utf-8").decode("unicode_escape"))))
    cells.pop(3)
    # 可以新增列但是以上别动
    cells.pop()


# t通过钩子修改报告信息表格中的信息
def pytest_html_results_table_html(report, data):
    if report.passed:
        del data[:]
        data.append(html.div(html.span("测试通过！", class_='passed'), class_='empty log'))
